home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
iguana
/
bla2src
/
adlib.inc
next >
Wrap
Text File
|
1994-02-12
|
11KB
|
392 lines
; ---------------------- ADLIB.INC ----------------------
; Adlib routines.
; (C) 1994 JCAB/VangeliSTeam
; ===========================
; Data.
ADL_Instrument STRUC
ADL_MFlMult DB ?
ADL_CFlMult DB ?
ADL_MKsrLoud DB ?
ADL_CKsrLoud DB ?
ADL_MAttDec DB ?
ADL_CAttDec DB ?
ADL_MSusRel DB ?
ADL_CSusRel DB ?
ADL_MWavef DB ?
ADL_CWavef DB ?
ADL_Mode DB ?
ENDS
ADL_ChanData STRUC
ADL_CVol DB ?
ADL_MReg DB ?
ADL_CReg DB ?
ENDS
ADL_Channels ADL_ChanData <0,00h,03h>
ADL_ChanData <0,01h,04h>
ADL_ChanData <0,02h,05h>
ADL_ChanData <0,08h,0Bh>
ADL_ChanData <0,09h,0Ch>
ADL_ChanData <0,0Ah,0Dh>
ADL_ChanData <0,10h,13h>
ADL_ChanData <0,11h,14h>
ADL_ChanData <0,12h,15h>
ADL_NoteTable DW 363, 385, 408, 432, 458, 485, 514, 544, 577, 611, 647, 686
ADL_Regs DB 256 DUP(0)
ADL_FRegs DB 256 DUP(0)
ADL_InsCount DW 0
; ===========================
; Wait loop. CX IN's from DX
ADL_Loop: MOV DX,3C0h
@@lp: IN AL,DX
LOOP @@lp
;SetBorder 0,0,0
RET
; ===========================
; Write AdLib register. AL=reg, AH=val
ADL_SendReg: MOV BX,AX
XOR BH,BH
MOV ADL_FRegs[BX],AH
MOV DX,388h
OUT DX,AL
MOV CX,6
CALL ADL_Loop
;SetBorder 63, 63, 0
MOV DX,389h
MOV AL,AH
OUT DX,AL
MOV CX,35
JMP ADL_Loop
; ===========================
; Reset routine.
ADL_Reset: MOV BX,1
@@lp: MOV AX,BX
AND AL,0E0h
CMP AL,40h
JNZ SHORT @@1
MOV AH,63
@@1: MOV AL,BL
CALL ADL_SendReg
INC BL
JNZ SHORT @@lp
RET
; ===========================
; Dumps an instrument to the card.
ADL_DumpInstrument:
; ----------------------- MPU stuff below!!!
PUSH AX
ADD AL,0C0h
CALL MPU_Send
POP AX
PUSH AX
MOV BL,AH
XOR BH,BH
MOV AL,MPU_Patches[BX]
CALL MPU_Send
POP AX
; -----------------------
XOR AH,AH
PUSH AX
MOV AH,SIZE ADL_ChanData
MUL AH
MOV DI,AX
ADD DI,OFFSET ADL_Channels
POP AX
MOV BX,AX
MOV AH,ADL_Mode[SI]
MOV ADL_Regs[BX+0C0h],AH
MOV AH,ADL_Regs[BX+0B0h]
AND AH,11011111b
CALL ADL_SendReg
MOV AH,ADL_CKsrLoud[SI]
NOT AH
AND AH,63
MOV ADL_CVol[DI],AH
MOV BL,ADL_MReg[DI]
XOR BH,BH
ADD BX,OFFSET ADL_Regs
MOV AH,ADL_MKsrLoud[SI]
MOV [BX+40h],AH
MOV AH,ADL_MFlMult[SI]
MOV [BX+20h],AH
MOV AH,ADL_MAttDec[SI]
MOV [BX+60h],AH
MOV AH,ADL_MSusRel[SI]
MOV [BX+80h],AH
MOV AH,ADL_MWavef[SI]
MOV [BX+0E0h],AH
; This is to make this more
INC SI ; compressable. The offsets below
; refer to the carrier, not the
; modulator!!!
MOV BL,ADL_CReg[DI]
XOR BH,BH
ADD BX,OFFSET ADL_Regs
MOV AH,ADL_MKsrLoud[SI]
AND AH,11000000b
OR AH,00111111b
AND BYTE PTR [BX+40h],00111111b
OR [BX+40h],AH
MOV AH,ADL_MFlMult[SI]
MOV [BX+20h],AH
MOV AH,ADL_MAttDec[SI]
MOV [BX+60h],AH
MOV AH,ADL_MSusRel[SI]
MOV [BX+80h],AH
MOV AH,ADL_MWavef[SI]
MOV [BX+0E0h],AH
RET
; ===========================
; Initialize the instruments of the song.
ADL_StartSong: MOV SI,OFFSET CMF_Instruments
MOV CX,9
@@lp: PUSH CX
PUSH SI
MOV AL,CH
MOV AH,AL
CALL ADL_DumpInstrument
POP SI
ADD SI,SIZE ADL_Instrument
POP CX
INC CH
DEC CL
JNZ SHORT @@lp
CALL ADL_Dump
RET
; ===========================
; Dump the changed registers to the FM chip.
ADL_Dump: MOV SI,OFFSET ADL_Regs
MOV DI,OFFSET ADL_FRegs
MOV CX,256
@@dumpl: REPE CMPSB
JCXZ SHORT @@dumpe
MOV AH,[SI-1]
MOV AL,255
SUB AL,CL
PUSH CX
CALL ADL_SendReg
POP CX
JMP SHORT @@dumpl
@@dumpe:RET
; ===========================
; Execute a tick of the song.
ADL_DoSong: PUSH AX BX CX DX SI DI BP DS ES
MOV AX,CS
MOV DS,AX
MOV ES,AX
;SetBorder 0, 0, 63
MOV BP,OFFSET CMF_Offsets
MOV [ADL_InsCount],CMF_NInstruments
@@otra:
;SetBorder 63, 0, 0
DEC WORD PTR CS:[BP]
JNZ @@Fin
;SetBorder 0, 63, 0
MOV SI,CS:[BP+2]
@@lp: LODSB
MOV AH,AL
AND AH,0F0h
CMP AH,90h
JC SHORT @@kon
JZ @@koff
CMP AH,0D0h
JZ @@normd
CMP AH,0E0h
JZ @@longd
; Song end.
MOV SI,CS:[BP+4]
JMP SHORT @@lp
@@kon: SHR AH,4
;SetBorder 0, 0, 63
PUSH AX
MOV AL,AH
ADD AL,0B0h
XOR AH,AH
CALL ADL_SendReg
POP AX
AND AL,15
;SetBorder 0, 63, 0
JZ SHORT @@yains
PUSH AX
PUSH SI
DEC AL
MOV BH,AH
PUSH AX
MOV AH,SIZE ADL_Instrument
MUL AH
MOV SI,AX
ADD SI,OFFSET CMF_Instruments
MOV AL,BH
POP BX
MOV AH,BL
CALL ADL_DumpInstrument
POP SI
POP AX
@@yains: LODSB
PUSH AX
AND AL,7Fh
SUB AL,13
XOR AH,AH
MOV BL,12
DIV BL
MOV BL,AH
XOR BH,BH
ADD BX,BX
MOV DX,ADL_NoteTable[BX]
ADD AL,AL
ADD AL,AL
OR DH,AL
OR DH,00100000b
POP AX
PUSH AX
MOV BL,AH
XOR BH,BH
MOV ADL_Regs[BX+0A0h],DL
MOV ADL_Regs[BX+0B0h],DH
ADD AL,AL
JNC SHORT @@novol
PUSH AX
MOV AL,SIZE ADL_Channels
MUL AH
MOV DI,AX
ADD DI,OFFSET ADL_Channels
LODSB
MUL ADL_CVol[DI]
XOR AH,3Fh
XOR BH,BH
MOV BL,ADL_CReg[DI]
AND ADL_Regs[BX+40h],11000000b
OR ADL_Regs[BX+40h],AH
POP AX
@@novol:
; ----------------------- MPU stuff below!!!
;SetBorder 63, 0, 0
POP AX
PUSH AX
MOV BL,AH
XOR BH,BH
ADD BX,OFFSET MPU_Notes
MOV AL,[BX]
AND AL,AL
JZ @@nooff
POP AX
PUSH AX
MOV AL,AH
ADD AL,80h
CALL MPU_Send
POP AX
PUSH AX
MOV AL,[BX]
CALL MPU_Send
MOV AL,7Fh
CALL MPU_Send
@@nooff:
POP AX
PUSH AX
MOV AL,AH
ADD AL,90h
CALL MPU_Send
POP AX
AND AL,7Fh
MOV [BX],AL
CALL MPU_Send
MOV AL,7Fh
CALL MPU_Send
@@nompu:
; -----------------------
;SetBorder 0, 0, 0
JMP @@lp
@@koff: AND AL,15
XOR AH,AH
MOV BX,AX
AND ADL_Regs[BX+0B0h],11011111b
JMP @@lp
@@longd: AND AL,15
MOV AH,AL
LODSB
INC AX
MOV DX,5
MUL DX
MOV CS:[BP],AX
JMP SHORT @@finish
@@normd: AND AL,15
INC AX
MOV AH,5
MUL AH
MOV CS:[BP],AX
@@finish:
;SetBorder 0, 0, 0
MOV CS:[BP+2],SI
@@Fin:
ADD BP,6
DEC [ADL_InsCount]
JNZ @@otra
CALL ADL_Dump
;SetBorder 0, 0, 0
POP ES DS BP DI SI DX CX BX AX
RET
; ---------------------- End of ADLIB.INC ----------------------